import datetime

from fastapi import APIRouter, Depends
from sqlalchemy.orm import Session
from database import get_db
from models.message import Message, UserMessage
from models.user import User
from schemas.message import MessageOut, MessageOutWrapper

from utils.token_utils import get_current_user

router = APIRouter(prefix="/api/message/v1", tags=["消息模块"], responses={404: {"description": "Not found"}})


@router.get("/", response_model=MessageOutWrapper, summary="获取信息")
def get_messages(db: Session = Depends(get_db), current_user: User = Depends(get_current_user)):
    all_messages = db.query(Message).order_by(Message.created_at.desc()).all()

    # 获取当前用户已读信息 ID 列表
    user_reads = db.query(UserMessage).filter(UserMessage.user_id == current_user.id).all()
    read_map = {ur.message_id: ur.status for ur in user_reads}

    result = []
    for msg in all_messages:
        result.append(MessageOut(
            id=msg.id,
            title=msg.title,
            content=msg.content,
            type=msg.type,
            status=read_map.get(msg.id, "unread"),  # 如果没查到就默认为未读
            created_at=msg.created_at
        ))

    return MessageOutWrapper(code=200, message="成功", data=result)


@router.post("/{message_id}/mark-read", summary="标记信息为已读")
def mark_as_read(
        message_id: int,
        db: Session = Depends(get_db),
        current_user: User = Depends(get_current_user)
):
    # 1. 查询目标消息是否存在
    message = db.query(Message).filter(Message.id == message_id).first()
    if not message:
        # 如果消息不存在，返回 404 错误
        return {"code": 404, "message": "消息不存在", "data": {}}

    # 2. 查询当前用户是否已经读过该消息
    user_msg = db.query(UserMessage).filter(
        UserMessage.message_id == message_id,
        UserMessage.user_id == current_user.id
    ).first()

    # 3. 如果没有找到对应的“用户-消息”记录，说明该用户是第一次读这条消息
    if not user_msg:
        user_msg = UserMessage(
            user_id=current_user.id,  # 当前登录用户的 ID
            message_id=message_id,  # 当前正在读取的消息 ID
            status="read",  # 标记为已读
        )
        db.add(user_msg)  # 插入记录
    else:
        # 如果已存在，更新状态和时间
        user_msg.status = "read"
        user_msg.read_at = datetime.datetime.utcnow()

    # 4. 提交数据库事务（无论是否新增记录）
    db.commit()

    # 5. 返回结果
    return {"code": 200, "message": "已标记为已读", "data": {}}
